package com.health.service.impl;

import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.health.mapper.OrderSetMapper;
import com.health.pojo.OrderSet;
import com.health.service.OrderSetService;
import com.health.vo.OrderSetVO;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderSetServiceImpl extends ServiceImpl<OrderSetMapper, OrderSet> implements OrderSetService {

    /**
     * 获取指定月份的预约设置数据
     *
     * @param currentYear
     * @param currentMonth
     * @return
     */
    @Override
    public List<OrderSetVO> getCalendarDataByMonth(Integer currentYear, Integer currentMonth) {
        // 获取当前日历实例
        int dayOfMonth = LocalDate.of(currentYear, currentMonth, 1)
                .lengthOfMonth();
        // 拼接开始时间和结束时间
        String min = currentYear + "-" + currentMonth + "-01";
        String max = currentYear + "-" + currentMonth + "-" + dayOfMonth;

        //  查询
        List<OrderSet> orderSetList = this.query()
                .between("order_date", min, max)
                .list();

        //将 List<OrderSet>   转换成   List<OrderSetVO>
        List<OrderSetVO> orderSetVOList = orderSetList.stream()
                .map(orderSet -> {
                    //创建一个OrderSetVO对象
                    OrderSetVO orderSetVO = new OrderSetVO();
                    //将orderSet中的数据封装到OrderSetVO对象中
                    orderSetVO.setNumber(orderSet.getNumber());
                    orderSetVO.setReservations(orderSet.getReservations());
                    orderSetVO.setDate(orderSet.getOrderDate()
                                               .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                    return orderSetVO;
                })
                .collect(Collectors.toList());

        //  返回 orderSetVOList
        return orderSetVOList;
    }

    /**
     * 修改预约设置信息
     *
     * @param orderSet
     */
    @Override
    public void updateOrderSet(OrderSet orderSet) {
        //1. 先根据预约日期查询
        OrderSet one = this.query()
                .eq("order_date", orderSet.getOrderDate()) //日期可以做比较
                .one();

        //2. 如果有数据，则修改，如果没有数据，则添加
        if (one != null) {
            //修改操作
            one.setNumber(orderSet.getNumber()); //设置可预约人数
            this.updateById(one);
        } else {
            //添加操作
            orderSet.setReservations(0);//已预约人数 默认0
            //添加预约设置数据
            this.save(orderSet);
        }
    }

    /**
     * 解析excel文件数据
     *
     * @param excelFile
     */
    @Override
    @SneakyThrows  //抑制异常，lombok将整个方法try catch
    public void parseExcel(MultipartFile excelFile) {
        //1. 通过hutool工具包解析读取excel数据
        ExcelReader reader = ExcelUtil.getReader(excelFile.getInputStream(), "Sheet1");
        //设置表头的别名
        reader.addHeaderAlias("可预约人数", "number");
        reader.addHeaderAlias("预约日期", "orderDate");
        List<OrderSet> orderSets = reader.readAll(OrderSet.class);

        //2. 将解析的数据添加到数据库
        for (OrderSet orderSet : orderSets) {
            this.updateOrderSet(orderSet);
        }
    }
}
